package com.want.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

/**
 * @author WangZhiJian
 * @since 2021/12/20 0020
 */
@RestController
@RequestMapping("test")
public class TestController {
    // 测试登录接口， 浏览器访问： http://localhost:8081/test/login
    @PostMapping("login")
    public AjaxJson login(@RequestParam(defaultValue="10001") String id) {
        System.out.println("======================= 进入方法，测试登录接口 ========================= ");
        System.out.println("当前会话的token：" + StpUtil.getTokenValue());
        System.out.println("当前是否登录：" + StpUtil.isLogin());
        System.out.println("当前登录账号：" + StpUtil.getLoginIdDefaultNull());

        StpUtil.login(id);			// 在当前会话登录此账号
        System.out.println("登录成功");
        System.out.println("当前是否登录：" + StpUtil.isLogin());
        System.out.println("当前登录账号：" + StpUtil.getLoginId());
//		System.out.println("当前登录账号并转为int：" + StpUtil.getLoginIdAsInt());
        System.out.println("当前登录设备：" + StpUtil.getLoginDevice());
//		System.out.println("当前token信息：" + StpUtil.getTokenInfo());

        return AjaxJson.getSuccess();
    }

    // 打印当前token信息， 浏览器访问： http://localhost:8081/test/hasRole
    @GetMapping("hasntRole")
    @SaCheckRole("admin:delete")
    public AjaxJson hasntRole() {
        System.out.println("======================= 进入hasntRole方法，打印当前token信息 ========================= ");
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        System.out.println(tokenInfo);
        return AjaxJson.getSuccessData(tokenInfo);
    }
    @GetMapping("hasRole")
    @SaCheckRole("admin")
    public AjaxJson hasRole() {
        System.out.println("======================= 进入hasRole方法，打印当前token信息 ========================= ");
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        System.out.println(tokenInfo);
        return AjaxJson.getSuccessData(tokenInfo);
    }
    // 打印当前token信息， 浏览器访问： http://localhost:8081/test/hasPermissionList
    @SaCheckPermission("user-add")
    @GetMapping("hasPermissionList")
    public AjaxJson hasPermissionList() {
        System.out.println("======================= 进入hasPermissionList方法，打印当前token信息 ========================= ");
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        System.out.println(tokenInfo);
        return AjaxJson.getSuccessData(tokenInfo);
    }
    @SaCheckPermission("user-add-delete")
    @GetMapping("hasntPermissionList")
    public AjaxJson hasntPermissionList() {
        System.out.println("======================= 进入hasntPermissionList方法，打印当前token信息 ========================= ");
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        System.out.println(tokenInfo);
        return AjaxJson.getSuccessData(tokenInfo);
    }

    // 打印当前token信息， 浏览器访问： http://localhost:8081/test/tokenInfo
    @GetMapping("tokenInfo")
    public AjaxJson tokenInfo() {
        System.out.println("======================= 进入方法，打印当前token信息 ========================= ");
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        System.out.println(tokenInfo);
        return AjaxJson.getSuccessData(tokenInfo);
    }

    // 测试   浏览器访问： http://localhost:8081/test/test
    @GetMapping("test")
    @SaCheckLogin
    public AjaxJson test() {
        System.out.println();
        System.out.println("--------------进入请求--------------");
        return AjaxJson.getSuccess();
    }
    /**
     * ajax请求返回Json格式数据的封装
     */
    public static class AjaxJson implements Serializable {

        private static final long serialVersionUID = 1L;	// 序列化版本号

        public static final int CODE_SUCCESS = 200;			// 成功状态码
        public static final int CODE_ERROR = 500;			// 错误状态码
        public static final int CODE_WARNING = 501;			// 警告状态码
        public static final int CODE_NOT_JUR = 403;			// 无权限状态码
        public static final int CODE_NOT_LOGIN = 401;		// 未登录状态码
        public static final int CODE_INVALID_REQUEST = 400;	// 无效请求状态码

        public int code; 	// 状态码
        public String msg; 	// 描述信息
        public Object data; // 携带对象
        public Long dataCount;	// 数据总数，用于分页

        /**
         * 返回code
         * @return
         */
        public int getCode() {
            return this.code;
        }

        /**
         * 给msg赋值，连缀风格
         */
        public AjaxJson setMsg(String msg) {
            this.msg = msg;
            return this;
        }
        public String getMsg() {
            return this.msg;
        }

        /**
         * 给data赋值，连缀风格
         */
        public AjaxJson setData(Object data) {
            this.data = data;
            return this;
        }

        /**
         * 将data还原为指定类型并返回
         */
        @SuppressWarnings("unchecked")
        public <T> T getData(Class<T> cs) {
            return (T) data;
        }

        // ============================  构建  ==================================

        public AjaxJson(int code, String msg, Object data, Long dataCount) {
            this.code = code;
            this.msg = msg;
            this.data = data;
            this.dataCount = dataCount;
        }

        // 返回成功
        public static AjaxJson getSuccess() {
            return new AjaxJson(CODE_SUCCESS, "ok", null, null);
        }
        public static AjaxJson getSuccess(String msg) {
            return new AjaxJson(CODE_SUCCESS, msg, null, null);
        }
        public static AjaxJson getSuccess(String msg, Object data) {
            return new AjaxJson(CODE_SUCCESS, msg, data, null);
        }
        public static AjaxJson getSuccessData(Object data) {
            return new AjaxJson(CODE_SUCCESS, "ok", data, null);
        }
        public static AjaxJson getSuccessArray(Object... data) {
            return new AjaxJson(CODE_SUCCESS, "ok", data, null);
        }

        // 返回失败
        public static AjaxJson getError() {
            return new AjaxJson(CODE_ERROR, "error", null, null);
        }
        public static AjaxJson getError(String msg) {
            return new AjaxJson(CODE_ERROR, msg, null, null);
        }

        // 返回警告
        public static AjaxJson getWarning() {
            return new AjaxJson(CODE_ERROR, "warning", null, null);
        }
        public static AjaxJson getWarning(String msg) {
            return new AjaxJson(CODE_WARNING, msg, null, null);
        }

        // 返回未登录
        public static AjaxJson getNotLogin() {
            return new AjaxJson(CODE_NOT_LOGIN, "未登录，请登录后再次访问", null, null);
        }

        // 返回没有权限的
        public static AjaxJson getNotJur(String msg) {
            return new AjaxJson(CODE_NOT_JUR, msg, null, null);
        }

        // 返回一个自定义状态码的
        public static AjaxJson get(int code, String msg){
            return new AjaxJson(code, msg, null, null);
        }

        // 返回分页和数据的
        public static AjaxJson getPageData(Long dataCount, Object data){
            return new AjaxJson(CODE_SUCCESS, "ok", data, dataCount);
        }

        // 返回，根据受影响行数的(大于0=ok，小于0=error)
        public static AjaxJson getByLine(int line){
            if(line > 0){
                return getSuccess("ok", line);
            }
            return getError("error").setData(line);
        }

        // 返回，根据布尔值来确定最终结果的  (true=ok，false=error)
        public static AjaxJson getByBoolean(boolean b){
            return b ? getSuccess("ok") : getError("error");
        }

        /* (non-Javadoc)
         * @see java.lang.Object#toString()
         */
        @SuppressWarnings("rawtypes")
        @Override
        public String toString() {
            String data_string = null;
            if(data == null){

            } else if(data instanceof List){
                data_string = "List(length=" + ((List)data).size() + ")";
            } else {
                data_string = data.toString();
            }
            return "{"
                    + "\"code\": " + this.getCode()
                    + ", \"msg\": \"" + this.getMsg() + "\""
                    + ", \"data\": " + data_string
                    + ", \"dataCount\": " + dataCount
                    + "}";
        }
    }
}
